package com.safeneeds.util.date;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 日期工具类
 * 
 * @version 1.0
 * @date 2016-05-06
 * @author gaof
 */
public final class DateUtil {
	
	/**
	 * yyyy-MM-dd
	 */
	private static final SimpleDateFormat YMD_DATE_NOMAL = new SimpleDateFormat(
			"yyyy-MM-dd");
	/**
	 * yyyy-MM
	 */
	private static final SimpleDateFormat YM_DATE_NOMAL = new SimpleDateFormat(
			"yyyy-MM");
	/**
	 * yyyy-MM-dd HH:mm:ss
	 */
	private static final SimpleDateFormat YMDHMS_DATE_NOMAL = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");
	/**
	 * yyyy-MM-dd HH:mm
	 */
	private static final SimpleDateFormat YMDHM_DATE_NOMAL = new SimpleDateFormat(
	        "yyyy-MM-dd HH:mm");

	/**
	 * yyyyMMdd
	 */
	private static final SimpleDateFormat YMD_DATE_FORMAT = new SimpleDateFormat(
			"yyyyMMdd");
	
	/**
	 * yyyy.MM.dd
	 */
	private static final SimpleDateFormat YMD_DATE_FORMAT_POINT = new SimpleDateFormat(
	       "yyyy.MM.dd");

	/**
	 * yyyyMM
	 */
	private static final SimpleDateFormat YM_DATE_FORMAT = new SimpleDateFormat(
			"yyyyMM");

	/**
	 * HHmmss
	 */
	private static final SimpleDateFormat HMS_DATE_FORMAT = new SimpleDateFormat(
			"HHmmss");
	
	/**
	 * HHmm
	 */
	private static final SimpleDateFormat HM_DATE_FORMAT = new SimpleDateFormat(
			"HHmm");
	
	/**
	 * HH:mm:ss
	 */
	private static final SimpleDateFormat CHINA_HMS_DATE_FORMAT = new SimpleDateFormat(
	        "HH:mm:ss");
	
	/**
	 * HH:mm
	 */
	private static final SimpleDateFormat CHINA_HM_DATE_FORMAT = new SimpleDateFormat(
            "HH:mm");

	/**
	 * yyyyMMddHHmmss
	 */
	private static final SimpleDateFormat YMDHMS_DATE_FORMAT = new SimpleDateFormat(
			"yyyyMMddHHmmss");

	/**
	 * yyyy 年 MM 月 dd 日
	 */
	private static SimpleDateFormat CHINA_YMD_DATE_FORMAT = new SimpleDateFormat(
			"yyyy 年 MM 月 dd 日");
	
	/**
	 * yyyy年MM月dd日
	 */
	private static SimpleDateFormat CHINA_YMD_DATE_FORMAT2 = new SimpleDateFormat(
	        "yyyy年MM月dd日");
	
	/**
	 * yy-MM-dd HH:mm
	 */
	private static SimpleDateFormat BARS_YMDHM_DATE_FORMAT = new SimpleDateFormat(
			"yy-MM-dd HH:mm");
	
	/**
	 * yy-MM-dd
	 */
	private static SimpleDateFormat BARS_YMD_DATE_FORMAT = new SimpleDateFormat(
			"yy-MM-dd");
	
	/**
	 * M.d
	 */
	private static SimpleDateFormat MD_DATE_FORMAT = new SimpleDateFormat(
	        "M.d");

	/**
	 * 得到当天的年月日格式yyyymmdd
	 * 
	 * @return
	 */
	public static String getDateByYMD() {
		return DateUtil.YMD_DATE_FORMAT.format(System.currentTimeMillis());
	}

	/**
	 * 得到当天的年月格式yyyymm
	 * 
	 * @return
	 */
	public static String getDateByYM() {
		return DateUtil.YM_DATE_FORMAT.format(System.currentTimeMillis());
	}

	/**
	 * 得到当天的年月日格式yyyymmdd
	 * 
	 * @return
	 */
	public static String getDateByYMD(Date date) {
		return DateUtil.YMD_DATE_FORMAT.format(date);
	}

	public static Date parseDateYMDString(String ymd) {
		try {
			return DateUtil.YMD_DATE_FORMAT.parse(ymd);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 得到当天的时分秒格式
	 * 
	 * @return
	 */
	public static String getDateByHMS() {
		return HMS_DATE_FORMAT.format(System.currentTimeMillis());
	}

	/**
	 * 得到当天的年月日时分秒格式 yyyyMMddHHmmss
	 * @return
	 */
	public static String getDatebyYMDHMS() {
		return YMDHMS_DATE_FORMAT.format(System.currentTimeMillis());
	}
	/**
	 * ymdhms转变成date类型
	 * 
	 * @return
	 */
	public static Date parseDateYMD(String ymdhms) {
		try {
			return DateUtil.YMD_DATE_NOMAL.parse(ymdhms);
		} catch (ParseException e) {
			return null;
		}
	}
	public static Date parseDateYMDHMSString(String ymdhms) {
		try {
			return DateUtil.YMD_DATE_FORMAT.parse(ymdhms);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 得到当天的年月日格式
	 * 
	 * @return
	 */
	public static String getNowStr() {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return format.format(System.currentTimeMillis());
	}
	
	/**
	 * 得到当天的年月日格式
	 * 
	 * @return
	 */
	public static String getNowYMD() {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		return format.format(System.currentTimeMillis());
	}
	
	/**
	 * 得到当天的年月日格式时分秒
	 * 
	 * @return
	 */
	public static Date getNowDate(){
		SimpleDateFormat sf = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
		java.util.Date date = null;
		try {
			date = sf.parse(DateUtil.getNowStr());
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return date;
	}
	
	/**
	 * 将date类型转换成yyyy-MM-dd
	 * @param date
	 * @return
	 */
	public static String getDateByYMDnormal(Date date) {
		try {
			return DateUtil.YMD_DATE_NOMAL.format(date);
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	
	/**
	 * 将date类型转换成HH:MM
	 * @param date
	 * @return
	 */
	public static String getHHmmByDate(Date date) {
		try {
			return DateUtil.CHINA_HM_DATE_FORMAT.format(date);
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	
	/**
	 * 得到前N天的日期YYYYMMDD
	 * 
	 * @return
	 */
	public static String getPrevDateByYMD(int days) {
		return getNextDateByYMD(-days);
	}

	/**
	 * 得到后N天的日期YYYYMMDD
	 * 
	 * @return
	 */
	public static String getNextDateByYMD(int days) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DAY_OF_MONTH, days);
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
		return format.format(calendar.getTime());
	}
	
	/**
	 * 将date类型转换成yyyy-MM-dd HH:mm:ss
	 * @param date
	 * @return
	 */
	public static String getDateByYMDHMNSS(Date date) {
		
		if (date == null) {
			return "";
		}
		
		try {
			return DateUtil.YMDHMS_DATE_NOMAL.format(date);
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	
	/**
	 * 将date类型转换成yyyy-MM-dd HH:mm
	 * @param date
	 * @return
	 */
	public static String getDateByYMDHMN(Date date) {
		
		if (date == null) {
			return "";
		}
		
		try {
			return DateUtil.YMDHM_DATE_NOMAL.format(date);
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	
	/**
	 * 将date类型转换成yyyyMMddHHmmss
	 * @param date
	 * @return
	 */
	public static String getDateByYMDHMS(Date date) {
		
		if (date == null) {
			return "";
		}
		
		try {
			return DateUtil.YMDHMS_DATE_FORMAT.format(date);
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	
	/**
	 * 得到日期YYYYMMDD,指定前后几天的日期
	 * 
	 * @return
	 */
	public static String getNextDateByYMD(String yyyymmdd,int days) {
		Date date = null;
		try {
			date = YMD_DATE_FORMAT.parse(yyyymmdd);
		} catch (ParseException e) {
			date = null;
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH, days);
		return YMD_DATE_FORMAT.format(calendar.getTime());
	}

	/**
	 * 将yyMMdd时间类型转成yyyy 年 MM 月 dd 日
	 * 
	 * @param yyyymmdd
	 * @return
	 */
	public static String convertToDateHanzi(String yyyymmdd) {
		Date date = null;
		try {
			date = YMD_DATE_FORMAT.parse(yyyymmdd);
		} catch (ParseException e) {
			date = null;
		}
		return CHINA_YMD_DATE_FORMAT.format(date);
	}

	/**
	 * 将yyyyMMddHHmmss时间类型转成yyyy年MM月dd日
	 * 
	 * @param yyyyMMddHHmmss
	 * @return
	 */
	public static String convert16To8Hanzi(String yyyyMMddHHmmss) {
		Date date = null;
		try {
			date = YMDHMS_DATE_FORMAT.parse(yyyyMMddHHmmss);
		} catch (ParseException e) {
			date = null;
		}
		return CHINA_YMD_DATE_FORMAT2.format(date);
	}
	
	/**
	 * 将yyyyMMdd时间类型转成yyyy-MM-dd
	 * 
	 * @param yyyymmdd
	 * @return
	 */
	public static String formatDateToNormal(String yyyyMMdd) {

		try {
			Date date = YMD_DATE_FORMAT.parse(yyyyMMdd);

			return YMD_DATE_NOMAL.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}
	/**
	 * ymdhms转变成date类型
	 * 
	 * @return
	 */
	public static Date parseDateYMDHMS(String ymdhms) {
		try {
			return DateUtil.YMDHMS_DATE_FORMAT.parse(ymdhms);
		} catch (ParseException e) {
			return null;
		}
	}
	/**
	 * 将yyyy-MM-dd时间类型转成yyyyMMdd
	 * 
	 * @param yyyy-MM-dd
	 * @return
	 */
	public static String formatDateToAbNormal(String yyyyMMdd) {

		try {
			Date date = YMD_DATE_NOMAL.parse(yyyyMMdd);
			return YMD_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}
	
	/**
	 * 将yyyy-MM-dd时间类型转成yyyy.MM.dd
	 * 
	 * @param yyyy-MM-dd
	 * @return
	 */
	public static String formatDateToPointSpilt(String yyyyMMdd) {

		try {
			Date date = YMD_DATE_NOMAL.parse(yyyyMMdd);
			return YMD_DATE_FORMAT_POINT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}
	
	/**
	 * 将yyyyMMdd时间类型转成yyyy.MM.dd
	 * 
	 * @param yyyyMMdd
	 * @return
	 */
	public static String formatAbNDateToPointSpilt(String yyyyMMdd) {

		try {
			Date date = YMD_DATE_FORMAT.parse(yyyyMMdd);
			return YMD_DATE_FORMAT_POINT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}
	
	/**
	 * 将yyMMddhhmmss时间类型转成yyyy-MM-dd hh:mm:ss
	 * 
	 * @param yyyyMMddhhmmss
	 * @return
	 */
	public static String formatDateTimeToNormal(String yyyyMMddHHmmss) {

		try {
			Date date = YMDHMS_DATE_FORMAT.parse(yyyyMMddHHmmss);

			return YMDHMS_DATE_NOMAL.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}

	/**
	 * 将yyyy-MM-dd hh:mm:ss时间类型转成yyyyMMddhhmmss
	 * 
	 * @param yyyyMMddhhmmss
	 * @return
	 */
	public static String formatDateTimeTo14b(String yyyyMMddHHmmss) {

		try {
			Date date = YMDHMS_DATE_NOMAL.parse(yyyyMMddHHmmss);
			return YMDHMS_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
		
	}
	
	/**
	 * 将yyMMddhhmmss时间类型转成yyyy-MM-dd
	 * 
	 * @param yyyyMMddhhmmss
	 * @return
	 */
	public static String formatDateTimeToAbNormal(String yyyyMMddHHmmss) {

		try {
			Date date = YMDHMS_DATE_FORMAT.parse(yyyyMMddHHmmss);

			return YMD_DATE_NOMAL.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}
	/**
     * @Description: String类型毫秒数转换成日期
     * 
     * @param lo 毫秒数
     * @return String yyyy-MM-dd HH:mm:ss
     */
    public static String stringToDate(String lo){
        long time = Long.parseLong(lo);
        Date date = new Date(time);
        return YMDHMS_DATE_NOMAL.format(date);
    }
    
	/**
	 * 将yyMMddhhmmss时间类型转成yyyyMMdd
	 * 
	 * @param yyyyMMddhhmmss
	 * @return
	 */
	public static String formatDateTimeTo8b(String yyyyMMddHHmmss) {

		try {
			Date date = YMDHMS_DATE_FORMAT.parse(yyyyMMddHHmmss);

			return YMD_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}
	
	/**
	 * 获取当前月最后一天
	 * 
	 * @param date
	 * @return
	 */
	public static String getLastDayOfMonth(){
		Calendar calendar = new GregorianCalendar();  
		calendar.add(Calendar.MONTH, 1);  
        calendar.set(Calendar.DAY_OF_MONTH, 0);
		return getDateByYMD(calendar.getTime());
	}
	
	/**
	 * 获取当前月第一天
	 * 
	 * @param date
	 * @return
	 */
	public static Date getBeginDayOfMonth(){
		Calendar calendar = new GregorianCalendar();  
		//calendar.add(Calendar.MONTH, 1);  
        calendar.set(Calendar.DAY_OF_MONTH, 1);
		return calendar.getTime();
	}
	
	/**
	 * 获取当前月第一天/-m指当前月前m个月，m只值当前月的后m个月，0指当前月
	 * 
	 * @param date
	 * @return
	 */
	public static String getBeginDayOfMonthByMonth(int m){
		Calendar calendar = new GregorianCalendar();  
		calendar.add(Calendar.MONTH, m);  
        calendar.set(Calendar.DAY_OF_MONTH, 1);
		return getDateByYMD(calendar.getTime());
	}
	
	
	/**
	 * 获取当前月的前/后N个月的年月
	 * 
	 * @param d 0:当前年月;1:后一个月；-1：前一个月
	 * @return
	 */
	public static String getPreMonth(int d){
		Calendar calendar = new GregorianCalendar();  
		calendar.add(Calendar.MONTH, d+1);  
        calendar.set(Calendar.DAY_OF_MONTH, 0);
		return DateUtil.YM_DATE_FORMAT.format(calendar.getTime());
	}
	
	/**
	 * 获取上个月 20141212->201411
	 * @param month
	 * @return
	 */
	public static String getPreMonth(String month){
		Calendar calendar = new GregorianCalendar();
		calendar.set(Calendar.MONTH, Integer.parseInt(month.substring(4, 6))-2);
		return DateUtil.YM_DATE_FORMAT.format(calendar.getTime());
		
	}
	
	/**
	 * 获取下个月 20141212->201501
	 * @param month
	 * @return
	 */
	public static String getNextMonth(String yyyyMMdd){
		Calendar calendar = new GregorianCalendar();
		calendar.set(Calendar.MONTH, Integer.parseInt(yyyyMMdd.substring(4, 6))+0);
		
		return DateUtil.YM_DATE_FORMAT.format(calendar.getTime());
		
	}
	
	/**
	 * 获取下个月的当天 20141212->20150112
	 * @param month
	 * @return
	 */
	public static String getNextMonthDay(String yyyyMMdd){
		
		//String nextMonth = getNextMonth(yyyyMMdd);
		String lastDay = getLastDayOfMonth(yyyyMMdd);
		int day = Integer.parseInt(lastDay.substring(6,8));
		
		return getNextDateByYMD(yyyyMMdd,day);
		
	}
	
	
	/**
	 * 将yyMMddhhmmss时间类型转成yy-MM-dd
	 * 
	 * @param yyyyMMddhhmmss
	 * @return
	 */
	public static String formatBars14To6b(String yyyyMMddHHmmss) {

		try {
			Date date = YMDHMS_DATE_FORMAT.parse(yyyyMMddHHmmss);

			return BARS_YMD_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 将yyMMddhhmmss时间类型转成yy-MM-dd hh:ss
	 * 
	 * @param yyyyMMddhhmmss
	 * @return
	 */
	public static String formatBars14To10b(String yyyyMMddHHmmss) {

		try {
			Date date = YMDHMS_DATE_FORMAT.parse(yyyyMMddHHmmss);

			return BARS_YMDHM_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 将yyMMddhhmmss时间类型转成yyyy-MM-dd hh:ss
	 * 
	 * @param yyyyMMddhhmmss
	 * @return
	 */
	public static String formatBars14To12b(String yyyyMMddHHmmss) {

		try {
			Date date = YMDHMS_DATE_FORMAT.parse(yyyyMMddHHmmss);

			return YMDHM_DATE_NOMAL.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 将yyyyMMdd时间类型转成yy-MM-dd
	 * 
	 * @param yyyyMMddhhmmss
	 * @return
	 */
	public static String formatBars8To6b(String yyyyMMdd) {

		try {
			Date date = YMD_DATE_FORMAT.parse(yyyyMMdd);

			return BARS_YMD_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 将yyyyMM时间类型转成yyyy-MM
	 * 
	 * @param yyyyMMddhhmmss
	 * @return
	 */
	public static String format6To6b(String yyyyMM) {

		try {
			Date date = YM_DATE_FORMAT.parse(yyyyMM);

			return YM_DATE_NOMAL.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 将yyyy-MM时间类型转成yyyyMM
	 * 
	 * @param yyyyMMddhhmmss
	 * @return
	 */
	public static String format6Bo6T(String yyyyMM) {

		try {
			Date date = YM_DATE_NOMAL.parse(yyyyMM);

			return YM_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 将yyyyMMdd时间类型转成MM.dd
	 * 
	 * @param yyyyMMddhhmmss
	 * @return
	 */
	public static String formatYmdToMd(String yyyyMMdd) {

		try {
			Date date = YMD_DATE_FORMAT.parse(yyyyMMdd);

			return MD_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 根据yyyyMM获取该月的月初yyyy-MM-dd
	 * @param yyyyMM
	 * @return
	 */
	public static String formatFirstDayOfMonth(String yyyyMM){
		try{
			Calendar cl = Calendar.getInstance();
			cl.set(Calendar.YEAR, Integer.parseInt(yyyyMM.substring(0, 4)));
			cl.set(Calendar.MONTH,Integer.parseInt(yyyyMM.substring(4, 6))-1);
			
			cl.set(Calendar.DATE, 1);
			
			return YMD_DATE_NOMAL.format(cl.getTime());
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 根据yyyyMM获取该月的最后一天的日期yyy-MM-dd
	 * @param yyyyMM
	 * @return
	 */
	public static String formatLastDayOfMonth(String yyyyMM){
		try{
			Calendar cl = Calendar.getInstance();
			cl.set(Calendar.YEAR, Integer.parseInt(yyyyMM.substring(0, 4)));
			cl.set(Calendar.MONTH,Integer.parseInt(yyyyMM.substring(4, 6))-1);
			
			cl.set(Calendar.DATE, 1);
			cl.add(Calendar.MONTH, 1);
			cl.add(Calendar.DATE, -1);
			
			return YMD_DATE_NOMAL.format(cl.getTime());
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 根据yyyyMM获取该月的月初yyyyMMdd
	 * @param yyyyMM
	 * @return
	 */
	public static String getFirstDayOfMonth(String yyyyMM){
		try{
			Calendar cl = Calendar.getInstance();
			cl.set(Calendar.YEAR, Integer.parseInt(yyyyMM.substring(0, 4)));
			cl.set(Calendar.MONTH,Integer.parseInt(yyyyMM.substring(4, 6))-1);
			
			cl.set(Calendar.DATE, 1);
			
			return YMD_DATE_FORMAT.format(cl.getTime());
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 根据yyyyMM获取该月的最后一天的日期yyyMMdd
	 * @param yyyyMM
	 * @return
	 */
	public static String getLastDayOfMonth(String yyyyMM){
		try{
			Calendar cl = Calendar.getInstance();
			cl.set(Calendar.YEAR, Integer.parseInt(yyyyMM.substring(0, 4)));
			cl.set(Calendar.MONTH,Integer.parseInt(yyyyMM.substring(4, 6))-1);
			
			cl.set(Calendar.DATE, 1);
			cl.add(Calendar.MONTH, 1);
			cl.add(Calendar.DATE, -1);
			
			return YMD_DATE_FORMAT.format(cl.getTime());
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	* 取得当月天数
	* */
	public static int getCurrentMonthLastDay(){
		
		Calendar a = Calendar.getInstance();
		a.set(Calendar.DATE, 1);//把日期设置为当月第一天
		a.roll(Calendar.DATE, -1);//日期回滚一天，也就是最后一天
		int maxDate = a.get(Calendar.DATE);
		
		return maxDate;
	}
	
	/**
	 * 将HH-mm-ss时间类型转成HHmmss
	 * 
	 * @return
	 */
	public static String getDateByHMS(String HHmmss) {
		
		try {
			Date date = CHINA_HMS_DATE_FORMAT.parse(HHmmss);

			return HMS_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 将时间类型HHmmss转成HH:mm:ss
	 * 
	 * @return
	 */
	public static String formatHMSToNormal(String HHmmss) {
		
		try {
			Date date = HMS_DATE_FORMAT.parse(HHmmss);

			return CHINA_HMS_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 将时间类型HHmmss转成HH:mm
	 * 
	 * @return
	 */
	public static String formatHMSToHM(String HHmmss) {
		
		try {
			Date date = HMS_DATE_FORMAT.parse(HHmmss);

			return CHINA_HM_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 将时间类型HHmm转成HH:mm
	 * 
	 * @return
	 */
	public static String formatHMToHM(String HHmm) {
		
		if(null == HHmm||"".equals(HHmm)){
			
			return "";
		}
		
		try {
			Date date = HM_DATE_FORMAT.parse(HHmm);

			return CHINA_HM_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 将HH:mm时间类型转成HHmm
	 * 
	 * @return
	 */
	public static String getDateByMS(String HHmm) {
		
		try {
			Date date = CHINA_HM_DATE_FORMAT.parse(HHmm);

			return HM_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 将时间类型YYYYMMDDHHmmss转成HH:mm:ss
	 * 
	 * @return
	 */
	public static String formatYMDHMSToNormal(String HHmmss) {
		
		try {
			Date date = YMDHMS_DATE_FORMAT.parse(HHmmss);

			return CHINA_HMS_DATE_FORMAT.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/** 
     * 计算两个日期之间相差的天数 
     * @param date1 
     * @param date2 
     * @return 
     */  
    public static int daysBetween(String date1,String date2)  
    {  
    	
    	long between_days = 0L;
    	
		try {
			
			Date date3 = YMD_DATE_FORMAT.parse(date1);
			Date date4 = YMD_DATE_FORMAT.parse(date2);
			
			Calendar cal = Calendar.getInstance();  
	        cal.setTime(date3);  
	        long time1 = cal.getTimeInMillis();               
	        cal.setTime(date4);  
	        long time2 = cal.getTimeInMillis();       
	        between_days= Math.abs(time2-time1)/(1000*3600*24);  

		} catch (ParseException e) {
			
			e.printStackTrace();
		}
    	
		return Integer.parseInt(String.valueOf(between_days)); 
                
    }  
    
    /**
	 * 得到日期YYYYMMDD,指定前后几月的日期
	 * 
	 * @return
	 */
	public static String getNextMonthByYMD(String yyyymmdd,int month) {
		Date date = null;
		try {
			date = YMD_DATE_FORMAT.parse(yyyymmdd);
		} catch (ParseException e) {
			date = null;
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, month);
		return YMD_DATE_FORMAT.format(calendar.getTime());
	}
	
	/**
	 * 将秒转变成小时
	 * 
	 * @return
	 */
	public static String getSecondToHour(String second) {
        String timeNormal = "";
		
		if(null == second || "".equals(second) || "0".equals(second)){
			timeNormal = "0";
		}else{
			int hour = Integer.parseInt(second)/3600;
			int s = Integer.parseInt(second)%3600;
			BigDecimal decimal = new BigDecimal(s/60.0).setScale(0, BigDecimal.ROUND_HALF_UP);
			
			if(hour>0){
				timeNormal = hour+"小时"+decimal.toString()+"分";
			}else{
				timeNormal = decimal.toString()+"分";
			}   
		}
		return timeNormal;
	}
	
	/**
	 * 时间相减并转换成秒 结束时间HHmmss-开始HHmmss
	 * 
	 * @return
	 */
	public static Long getHmsToSecond(String bHHmmss,String eHHmmss) {
		
		SimpleDateFormat dfs = new SimpleDateFormat("HHmmss");
		
		java.util.Date begin;
		java.util.Date end;
		long between =0;
		
		try {
			
			begin=dfs.parse(bHHmmss);
			end = dfs.parse(eHHmmss);
			between=(end.getTime()-begin.getTime())/1000;//除以1000是为了转换成秒 
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return between;
	}
	
	/**
	 * 时间相减并转换成秒 结束时间yyyyMMddHHmmss-开始yyyyMMddHHmmss
	 * 
	 * @return
	 */
	public static Long getYmdHmsToSecond(String bYmdHms,String eYmdHms) {
		
		SimpleDateFormat dfs = new SimpleDateFormat("yyyyMMddHHmmss");
		
		java.util.Date begin;
		java.util.Date end;
		long between =0;
		
		try {
			
			begin=dfs.parse(bYmdHms);
			end = dfs.parse(eYmdHms);
			between=(end.getTime()-begin.getTime())/1000;//除以1000是为了转换成秒 
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return between;
	}
	
	/**
	 * 得到日期YYYYMMDD的星期几
	 * 
	 * @return
	 */
	public static int getWeek(String yyyymmdd) {
		
		Date date = null;
		int week_index = 0;
		try {
			date = YMD_DATE_FORMAT.parse(yyyymmdd);
			Calendar cal = Calendar.getInstance();  
	        cal.setTime(date);
	        week_index = cal.get(Calendar.DAY_OF_WEEK) - 1;  
	        if(week_index<0){  
	            week_index = 0;  
	        }
		} catch (ParseException e) {
			date = null;
		}
		
		return week_index;
	}
	
	public static void main(String[] args) {
		//System.out.println(getNextDateByYMD("20141212",-30));
        System.out.println(getWeek("20141020"));

    }
	
	/**
	 * 将date类型转换成HH:mm:ss
	 * @param date
	 * @return
	 */
	public static String getDateByHms(Date date) {
		try {
			return DateUtil.CHINA_HMS_DATE_FORMAT.format(date);
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	
	/**
	 * 将HH:mm:ss类型转换成date
	 * @param date
	 * @return
	 */
	public static Date getDateByHm(String hhmm) {
		try {
			return DateUtil.CHINA_HM_DATE_FORMAT.parse(hhmm);
		} catch (Exception e) {
			e.printStackTrace();
			return new Date();
		}
	}
	
	/**
     * 取得当前日期所在周的第一天
     *
     * @param date
     * @return
     */
    public static Date getFirstDayOfWeek(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.MONDAY);
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_WEEK,
                      calendar.getFirstDayOfWeek()); // Sunday
        return calendar.getTime();
    }
    
    /**
	 * 获取当前月的前/后N年的年月
	 * 
	 * @param d 0:当前年月;1:后一年；-1：前一年
	 * @return
	 */
	public static String getPreYear(int d){
		Calendar calendar = new GregorianCalendar();  
		calendar.add(Calendar.YEAR, d);  
		return DateUtil.YMD_DATE_NOMAL.format(calendar.getTime());
	}
	
	/**
	 * 比较开始时间是否大于结束时间
	 * @param start 开始时间，YYYY-MM-DD格式
	 * @param end 结束时间，YYYY-MM-DD格式
	 * @return true 开始时间大于结束时间
	 */
	public static boolean compareDateYYYYMMDD(String start, String end){
		
		try {
			Date startDate = YMD_DATE_NOMAL.parse(start);
			Date endDate = YMD_DATE_NOMAL.parse(end);
			
			Calendar cal = Calendar.getInstance();  
	        cal.setTime(startDate);  
	        long StartTime = cal.getTimeInMillis();               
	        cal.setTime(endDate);  
	        long endTime = cal.getTimeInMillis();
	        if(StartTime > endTime){
	        	return true;
	        }else{
	        	return false;
	        }
			
		} catch (ParseException e) {
			e.printStackTrace();
			return false;
		}
		
	}
	
	/**
	 * parseDateYMDString好像格式化时间好像有错误 
	 * 将字符串2017-02-11 转换 Sat Feb 11 00:00:00 CST 2017
	 * @param ymd
	 * @return
	 */
	public static Date parseDateYMDStringTest(String ymd) {
		try {
			return DateUtil.YMD_DATE_NOMAL.parse(ymd);
		} catch (ParseException e) {
			return null;
		}
	}
	
}
